#!/bin/bash

#############################################
# Git 配置自动化脚本
# 功能：
# 1. 检查并安装 Git
# 2. 配置 Git 全局用户信息
# 3. 创建 Gitee 访问密钥
# 4. 创建 GitHub 访问密钥
# 5. 自动配置 SSH config
#
# 使用方法：
# 1. 交互式运行（推荐）：
#    bash -c "$(curl -fsSL https://gitee.com/xledoo/deploy-sshkey/raw/master/setup_git.sh)"
#
# 2. 非交互式运行（通过curl管道）：
#    curl -fsSL https://gitee.com/xledoo/deploy-sshkey/raw/master/setup_git.sh | bash -s -- --yes
#
# 3. 非交互式运行（下载后执行）：
#    bash setup_git.sh --yes
#
# 参数说明：
#   --gitusername=<name>  Git 用户名（默认: xledoo）
#   --gitemail=<email>    Git 邮箱（默认: xledoo@qq.com）
#   --create-gitee-key    创建 Gitee 访问密钥（默认：自动创建）
#   --create-github-key   创建 GitHub 访问密钥
#   --yes, -y             自动确认所有提示，跳过交互
#   --force               强制覆盖现有配置
#   --help, -h            显示帮助信息
#
# 默认行为：
#   - Git 用户名：xledoo
#   - Git 邮箱：xledoo@qq.com
#   - Git 未安装时自动安装，已安装则跳过
#   - Gitee 密钥未创建时自动创建，已存在则跳过
#   - GitHub 密钥默认不创建
#############################################

set -e  # 遇到错误立即退出

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 参数变量
GIT_USERNAME="xledoo"
GIT_EMAIL="xledoo@qq.com"
CREATE_GITEE_KEY=true
CREATE_GITHUB_KEY=false
AUTO_YES=false
FORCE_INSTALL=false
NON_INTERACTIVE=false

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_step() {
    echo -e "${BLUE}[STEP]${NC} $1"
}

# 显示帮助信息
show_help() {
    cat << EOF
Git 配置自动化脚本

使用方法:
  bash setup_git.sh [选项]
  curl -fsSL https://gitee.com/xledoo/deploy-sshkey/raw/master/setup_git.sh | bash -s -- [选项]

选项:
  --gitusername=<name>  Git 用户名（默认: xledoo）
  --gitemail=<email>    Git 邮箱（默认: xledoo@qq.com）
  --create-gitee-key    创建 Gitee 访问密钥（默认：自动创建）
  --create-github-key   创建 GitHub 访问密钥
  --skip-gitee-key      跳过 Gitee 密钥创建
  --skip-github-key     跳过 GitHub 密钥创建（默认）
  --yes, -y             自动确认所有提示，启用非交互模式
  --force               强制覆盖现有配置
  --help, -h            显示此帮助信息

默认行为:
  - Git 用户名：xledoo
  - Git 邮箱：xledoo@qq.com
  - Git 未安装时自动安装，已安装则跳过
  - Gitee 密钥未创建时自动创建，已存在则跳过
  - GitHub 密钥默认不创建

示例:
  # 交互式配置（推荐，无交互问题）
  bash -c "$(curl -fsSL https://gitee.com/xledoo/deploy-sshkey/raw/master/setup_git.sh)"

  # 非交互式配置（使用默认配置）
  curl -fsSL https://gitee.com/xledoo/deploy-sshkey/raw/master/setup_git.sh | bash -s -- --yes

  # 自定义 Git 配置
  bash setup_git.sh --gitusername=myname --gitemail=my@email.com --yes

  # 同时创建 Gitee 和 GitHub 密钥
  bash setup_git.sh --create-gitee-key --create-github-key --yes

  # 强制覆盖现有配置
  bash setup_git.sh --force --yes

EOF
    exit 0
}

# 解析命令行参数
parse_arguments() {
    while [[ $# -gt 0 ]]; do
        case $1 in
            --gitusername=*)
                GIT_USERNAME="${1#*=}"
                shift
                ;;
            --gitemail=*)
                GIT_EMAIL="${1#*=}"
                shift
                ;;
            --create-gitee-key)
                CREATE_GITEE_KEY=true
                shift
                ;;
            --skip-gitee-key)
                CREATE_GITEE_KEY=false
                shift
                ;;
            --create-github-key)
                CREATE_GITHUB_KEY=true
                shift
                ;;
            --skip-github-key)
                CREATE_GITHUB_KEY=false
                shift
                ;;
            --yes|-y)
                AUTO_YES=true
                NON_INTERACTIVE=true
                shift
                ;;
            --force)
                FORCE_INSTALL=true
                shift
                ;;
            --help|-h)
                show_help
                ;;
            *)
                log_error "未知参数: $1"
                echo "使用 --help 查看帮助信息"
                exit 1
                ;;
        esac
    done
}

# 确保脚本可以接收交互式输入（仅在交互模式下）
setup_interactive_input() {
    if [[ "$NON_INTERACTIVE" == false && ! -t 0 ]]; then
        if ( : < /dev/tty ) 2>/dev/null; then
            exec < /dev/tty
        fi
    fi
}

# 检测Linux发行版
detect_os() {
    if [[ -f /etc/os-release ]]; then
        . /etc/os-release
        echo "$ID"
    elif [[ -f /etc/redhat-release ]]; then
        echo "rhel"
    elif [[ -f /etc/debian_version ]]; then
        echo "debian"
    else
        echo "unknown"
    fi
}

# 检查Git是否已安装
check_git() {
    if command -v git &> /dev/null; then
        local git_version=$(git --version | awk '{print $3}')
        log_info "Git已安装 (版本: $git_version)"
        return 0
    else
        log_warn "Git未安装"
        return 1
    fi
}

# 安装Git
install_git() {
    log_step "正在安装Git..."

    local os_type=$(detect_os)

    case "$os_type" in
        ubuntu|debian)
            log_info "检测到Debian/Ubuntu系统，使用apt安装..."
            apt-get update -qq
            apt-get install -y git
            ;;
        centos|rhel|fedora|almalinux|rocky)
            log_info "检测到RHEL系列系统，使用yum/dnf安装..."
            if command -v dnf &> /dev/null; then
                dnf install -y git
            else
                yum install -y git
            fi
            ;;
        arch|manjaro)
            log_info "检测到Arch系列系统，使用pacman安装..."
            pacman -Sy --noconfirm git
            ;;
        opensuse*)
            log_info "检测到openSUSE系统，使用zypper安装..."
            zypper install -y git
            ;;
        alpine)
            log_info "检测到Alpine系统，使用apk安装..."
            apk add --no-cache git
            ;;
        *)
            log_error "未知的操作系统类型: $os_type"
            log_error "请手动安装Git后重新运行此脚本"
            exit 1
            ;;
    esac

    # 验证安装
    if command -v git &> /dev/null; then
        local git_version=$(git --version | awk '{print $3}')
        log_info "Git安装成功 (版本: $git_version)"
    else
        log_error "Git安装失败"
        exit 1
    fi
}

# 配置Git
configure_git() {
    log_step "正在配置Git全局用户信息..."

    # 使用参数传递的值
    local git_username="$GIT_USERNAME"
    local git_email="$GIT_EMAIL"

    # 如果是交互模式，询问是否使用默认配置
    if [[ "$NON_INTERACTIVE" == false ]]; then
        echo ""
        log_info "默认 Git 配置："
        log_info "  - 用户名: $git_username"
        log_info "  - 邮箱: $git_email"
        echo ""
        read -p "是否使用默认配置? (yes/no) [默认: yes]: " use_default
        use_default=${use_default:-yes}

        if [[ "$use_default" != "yes" ]]; then
            # 用户选择自定义配置
            read -p "请输入Git用户名: " custom_username
            if [[ -n "$custom_username" ]]; then
                git_username="$custom_username"
            fi

            read -p "请输入Git邮箱: " custom_email
            if [[ -n "$custom_email" ]]; then
                git_email="$custom_email"
            fi
        fi
    fi

    # 配置用户名
    git config --global user.name "$git_username"
    log_info "  - user.name: $git_username"

    # 配置邮箱
    git config --global user.email "$git_email"
    log_info "  - user.email: $git_email"

    log_info "Git全局配置完成"
}

# 创建Gitee访问密钥
create_gitee_key() {
    echo ""
    log_step "配置Gitee访问密钥..."

    local gitee_key_path="$HOME/.ssh/id_ed25519_gitee"

    # 检查是否已存在Gitee密钥
    if [[ -f "$gitee_key_path" ]]; then
        log_info "Gitee访问密钥已存在: $gitee_key_path"

        if [[ "$FORCE_INSTALL" == true ]]; then
            log_warn "强制重新创建 Gitee 密钥（--force）"
        else
            return 0
        fi
    fi

    log_info "正在生成Gitee访问密钥..."

    # 获取Git邮箱作为密钥注释
    local git_email=$(git config --global user.email 2>/dev/null || echo "gitee-access")

    # 生成密钥对
    ssh-keygen -t ed25519 -C "gitee-$git_email" -f "$gitee_key_path" -N "" -q

    if [[ -f "$gitee_key_path" ]] && [[ -f "${gitee_key_path}.pub" ]]; then
        log_info "Gitee密钥生成成功"
        echo ""
        log_info "密钥位置:"
        log_info "  - 私钥: $gitee_key_path"
        log_info "  - 公钥: ${gitee_key_path}.pub"

        # 自动配置SSH config文件
        configure_ssh_config "gitee.com" "$gitee_key_path"

        # 显示公钥
        echo ""
        echo "========================================="
        log_warn "重要提示："
        echo "  1. SSH config已自动配置，Git将使用专用密钥访问Gitee"
        echo "  2. 请将以下公钥添加到Gitee SSH密钥设置"
        echo "  3. 访问: https://gitee.com/profile/sshkeys"
        echo "  4. 点击"添加公钥"，粘贴以下内容："
        echo ""
        echo "------- 公钥开始 -------"
        cat "${gitee_key_path}.pub"
        echo "------- 公钥结束 -------"
        echo ""
        echo "  5. 测试连接: ssh -T git@gitee.com"
        echo "========================================="
    else
        log_error "Gitee密钥生成失败"
        return 1
    fi
}

# 创建GitHub访问密钥
create_github_key() {
    echo ""
    log_step "配置GitHub访问密钥..."

    local github_key_path="$HOME/.ssh/id_ed25519_github"

    # 检查是否已存在GitHub密钥
    if [[ -f "$github_key_path" ]]; then
        log_info "GitHub访问密钥已存在: $github_key_path"

        if [[ "$FORCE_INSTALL" == true ]]; then
            log_warn "强制重新创建 GitHub 密钥（--force）"
        else
            return 0
        fi
    fi

    log_info "正在生成GitHub访问密钥..."

    # 获取Git邮箱作为密钥注释
    local git_email=$(git config --global user.email 2>/dev/null || echo "github-access")

    # 生成密钥对
    ssh-keygen -t ed25519 -C "github-$git_email" -f "$github_key_path" -N "" -q

    if [[ -f "$github_key_path" ]] && [[ -f "${github_key_path}.pub" ]]; then
        log_info "GitHub密钥生成成功"
        echo ""
        log_info "密钥位置:"
        log_info "  - 私钥: $github_key_path"
        log_info "  - 公钥: ${github_key_path}.pub"

        # 自动配置SSH config文件
        configure_ssh_config "github.com" "$github_key_path"

        # 显示公钥
        echo ""
        echo "========================================="
        log_warn "重要提示："
        echo "  1. SSH config已自动配置，Git将使用专用密钥访问GitHub"
        echo "  2. 请将以下公钥添加到GitHub SSH密钥设置"
        echo "  3. 访问: https://github.com/settings/keys"
        echo "  4. 点击"New SSH key"，粘贴以下内容："
        echo ""
        echo "------- 公钥开始 -------"
        cat "${github_key_path}.pub"
        echo "------- 公钥结束 -------"
        echo ""
        echo "  5. 测试连接: ssh -T git@github.com"
        echo "========================================="
    else
        log_error "GitHub密钥生成失败"
        return 1
    fi
}

# 配置SSH config
configure_ssh_config() {
    local host=$1
    local key_path=$2
    local ssh_config="$HOME/.ssh/config"

    log_info "正在配置SSH config文件..."

    # 创建.ssh目录（如果不存在）
    mkdir -p "$HOME/.ssh"
    chmod 700 "$HOME/.ssh"

    # 检查是否已有该主机配置
    if [[ -f "$ssh_config" ]] && grep -q "Host $host" "$ssh_config"; then
        log_warn "SSH config中已存在 $host 配置"

        if [[ "$FORCE_INSTALL" == true ]]; then
            log_warn "强制覆盖 $host 配置（--force）"
            # 删除旧配置
            sed -i "/^Host $host$/,/^$/d" "$ssh_config"
        else
            log_info "跳过 $host 配置"
            return 0
        fi
    fi

    # 添加配置到config文件
    cat >> "$ssh_config" << EOF

# $host 配置 - 自动生成于 $(date '+%Y-%m-%d %H:%M:%S')
Host $host
    HostName $host
    User git
    IdentityFile $key_path
    PreferredAuthentications publickey
EOF
    chmod 600 "$ssh_config"
    log_info "SSH config配置完成: $ssh_config"
}

# 检查和设置Git
setup_git() {
    log_info "检查Git安装状态..."

    # Git 未安装则自动安装
    if ! check_git; then
        log_info "Git 未安装，正在自动安装..."
        install_git
    fi

    echo ""

    # 检查是否已有Git配置
    local current_name=$(git config --global user.name 2>/dev/null || echo "")
    local current_email=$(git config --global user.email 2>/dev/null || echo "")

    if [[ -n "$current_name" ]] && [[ -n "$current_email" ]]; then
        log_info "Git已配置:"
        log_info "  - user.name: $current_name"
        log_info "  - user.email: $current_email"

        if [[ "$FORCE_INSTALL" == true ]]; then
            log_info "强制覆盖现有配置（--force）"
            echo ""
            configure_git
        elif [[ "$AUTO_YES" == false ]]; then
            echo ""
            read -p "是否覆盖现有配置? (yes/no) [默认: no]: " overwrite_confirm
            overwrite_confirm=${overwrite_confirm:-no}

            if [[ "$overwrite_confirm" == "yes" ]]; then
                configure_git
            else
                log_info "保留现有Git配置"
            fi
        else
            log_info "Git配置已存在，保留现有配置"
            log_info "使用 --force 参数可强制覆盖"
        fi
    else
        # 未配置则自动配置
        configure_git
    fi
}

# 显示配置摘要
show_summary() {
    echo ""
    echo "========================================="
    log_info "Git配置完成!"
    echo "========================================="
    echo ""
    log_info "配置信息:"

    if command -v git &> /dev/null; then
        echo "  - Git: $(git --version | awk '{print $3}')"
        echo "  - 用户名: $(git config --global user.name)"
        echo "  - 邮箱: $(git config --global user.email)"
    fi

    echo ""
    log_info "密钥信息:"

    if [[ -f "$HOME/.ssh/id_ed25519_gitee" ]]; then
        echo "  - Gitee 密钥: $HOME/.ssh/id_ed25519_gitee"
    fi

    if [[ -f "$HOME/.ssh/id_ed25519_github" ]]; then
        echo "  - GitHub 密钥: $HOME/.ssh/id_ed25519_github"
    fi

    echo ""
    log_info "SSH配置: $HOME/.ssh/config"
    echo ""
    log_warn "注意事项:"
    echo "  1. 请记得将公钥添加到对应的代码托管平台"
    echo "  2. 使用 ssh -T git@gitee.com 测试 Gitee 连接"
    echo "  3. 使用 ssh -T git@github.com 测试 GitHub 连接"
    echo "========================================="
}

# 主函数
main() {
    # 解析命令行参数
    parse_arguments "$@"

    # 设置交互式输入
    setup_interactive_input

    log_info "开始Git配置..."
    if [[ "$NON_INTERACTIVE" == true ]]; then
        log_info "运行模式: 非交互式"
    else
        log_info "运行模式: 交互式"
    fi
    echo ""

    # 检查和设置Git
    setup_git

    # 创建Gitee访问密钥
    if [[ "$CREATE_GITEE_KEY" == true ]]; then
        create_gitee_key
    else
        log_info "跳过 Gitee 密钥创建"
    fi

    # 创建GitHub访问密钥
    if [[ "$CREATE_GITHUB_KEY" == true ]]; then
        create_github_key
    fi

    # 显示摘要
    show_summary
}

# 执行主函数
main "$@"
